package br.com.yahoo.mau_mss.tutorlucene.service.impl;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.commons.lang3.SystemUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.springframework.stereotype.Service;
import br.com.yahoo.mau_mss.tutorlucene.model.Curriculum;

/**
 * Classe abstrata contendo atributos e métodos comuns às classes que
 * utilizam o Lucene.
 * 
 * @author Paulo Sigrist / Wilson A. Higashino
 *
 */
@Service("luceneBean")
public class LuceneBean {
  protected Analyzer analyzer;
  protected Directory directory;
  @Inject
  protected ConfigBean configBean;

  public LuceneBean() {
    super();
  }

  /**
   * Método de inicialização. Inicializa o Analyzer, interface que representa os
   * algoritmos de análise do Lucene e, o Directory do Engine Lucene que representa
   * o local no qual o índice é armazenado.
   * O StandardAnalyzer é o analisador padrão e implementa um conjunto de regras
   * tais como converter caracteres para minúsculas, remover stop words como the, 
   * an, or, etc., reconhecer e-mails
   * @see Analyzer
   * @see StandardAnalyzer
   * @see Directory
   * @see FSDirectory
   */
  @PostConstruct
  public void doInit() {
    this.analyzer = new StandardAnalyzer(Version.LUCENE_35);
    try {
      this.directory = FSDirectory.open(new File(configBean.getIndexDirectory()));
    } catch (IOException e) {
      throw new RuntimeException("Erro ao abrir o diretório de indexação", e);
    }
  }

  /**
   * Carrega o conteúdo do currículo que está armazenado em disco em um
   * objeto do tipo Curriculum.
   * 
   * @param file File do currículo a ser carregado
   * @return uma instância de {@link Curriculum} com os seus atributos
   *         preenchidos
   * @throws IOException
   * @see FileReader
   * @see BufferedReader
   */
  protected Curriculum loadCurriculum(File file) throws IOException {
    FileInputStream inputStream = new FileInputStream(file);
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    StringBuilder builder = new StringBuilder();
    Curriculum curriculum = new Curriculum();
    curriculum.setName(reader.readLine());
    curriculum.setEmail(reader.readLine());
    String s;
    while ((s = reader.readLine()) != null) {
      builder.append(s).append(SystemUtils.LINE_SEPARATOR);
    }
    reader.close();
    inputStream.close();
    curriculum.setContent(builder.toString());
    return curriculum;
  }
}
